<?php

namespace app\common\controller;

use think\Db;

class Sms
{
    public static function getRandSmscode()
    {
        return rand(100000, 999999);
    }

    public static function createContent($smsCode)
    {
        return "【翼GO】你的短信验证码为：$smsCode,请不要告诉别人！";
    }

    /**
     * 发送短信验证码
     * 
     * @param unknown $type
     *            验证码类型。1：用于系统登录；2：用于圈子营销登录。
     * @param unknown $phone
     *            接收短信的手机号。
     * @param unknown $sms_code
     *            短信验证码。非必须。如果不是发送短信验证码，该字段传空字符串""。
     * @param unknown $sms_content            
     * @return bool|string 验证通过返回true，验证错误返回错误信息。（调用方要用===判断）
     */
    public static function send_sms($type, $phone, $sms_code, $sms_content)
    {
        // 发送短信
        $result_des_arr = Sms::send_sms_msg($phone, $sms_content);

        // 短信是否发送成功。1-成功；-1-失败；0-未知。
        $is_success = 0;
        if ($result_des_arr) {
            if (!empty($result_des_arr["response_body"]) && $result_des_arr["response_body"] > 0) {
                $is_success = 1;
            } else {
                $is_success = -1;
            }
        }

        // 把短信发送结果入库。
        $res = db("sms")->insert([
            "type" => $type,
            "phone" => $phone,
            "sms_code" => $sms_code,
            "sms_content" => $sms_content,
            "is_success" => $is_success,
            "result_des" => json_encode($result_des_arr),
            "create_time" => time()
        ]);

        return $is_success == 1 ? true : json_encode($result_des_arr);
    }

    /**
     * 校验短信验证码是否正确。（验证码在5分钟之内且正确算验证通过）
     * 
     * @param unknown $type            
     * @param unknown $phone            
     * @param unknown $sms_code            
     * @return bool|string 验证通过返回true，验证错误返回错误信息。（调用方要用===判断）
     */
    public static function valide_sms_code($type, $phone, $sms_code)
    {
        $sms = Db::name("sms")->where("type", $type)
            ->where("phone", $phone)
            ->order("id desc")
            ->findObj();

        if (empty($sms)) {
            return "没有发送过短信";
        }

        $spaceTime = 5 * 60;
        if (config("self_debug") == 1) {
            $spaceTime = $spaceTime * 100;
        }
        if ($sms->create_time + $spaceTime < time()) {
            return "验证码已过期";
        }

        if ($sms->sms_code != $sms_code) {
            return "验证码错误";
        }

        //         if ($res["is_used"] == 1) {
        //             return "验证码已被使用";
        //         }

        Db::name("sms")->where("id", $sms->id)->update([
            "is_used" => 1
        ]);

        return true;
    }

    // 发送短信验证码，无论成功还是失败，都返回第三方返回的信息。
    private static function send_sms_msg($phone, $content)
    {
        static $yidongNo = ["134", "135", "136", "137", "138", "139", "150", "151", "152", "157", "158", "159", "182", "183", "187", "188", "198", "147", "178", "184"];
        static $liandongNo = ["130", "131", "132", "155", "156", "186", "185", "166", "145", "166", "175", "176", "186"];
        static $dianxinNo = ["133", "153", "180", "181", "189", "199", "173", "177", "149"];

        if (strlen($phone) != 11) {
            return;
        }

        $prePhone = substr($phone, 0, 3);

        if (in_array($prePhone, $yidongNo)) {
            $smsConfig = config("smsConfig")["yidong"];
        } elseif (in_array($prePhone, $liandongNo)) {
            $smsConfig = config("smsConfig")["liantong"];
        } elseif (in_array($prePhone, $dianxinNo)) {
            $smsConfig = config("smsConfig")["dianxin"];
        } else {
            logInfo("没有给这个手机号发短信，因为号段找不到：" . $phone);
            return;
        }

        $url = $smsConfig["sms_url"];
        $account = $smsConfig["sms_account"];
        $password = $smsConfig["sms_password"];

        //处理密码先md5加密再转大写
        $pass = strtoupper(md5($password));
        //组装数组
        $data = array(
            'uid' => $account,
            'password' => $pass,
            'mobile' => $phone, //多条例子 xxxx,xxxx
            'encode' => 'utf8',
            'content' => base64_encode($content), //把内容进行base64转换
            'encodeType' => 'base64',
            'cid' => '', // 唯一标识，选填，如果不填系统自动生成作为当前批次的唯一标识
            'extNumber' => '', // 扩展 选填
            'schtime' => '' // 定时时间，选填，格式2008-06-09 12:00:00
        );

        $res = Sms::httpPost($url, $data);

        return $res;
    }

    private static function httpPost($url, $data)
    {
        // 启动一个CURL会话
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url); //接口地址
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
        //php5的safe_model是关闭的
        if (ini_get('open_basedir') == '' && ini_get('safe_mode' == 'Off')) {
            curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
        }
        curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
        curl_setopt($curl, CURLOPT_HTTPHEADER, array(
            'Content-Type: application/x-www-form-urlencoded'
        ));
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        // 执行操作
        $response_body = curl_exec($curl);
        //捕抓异常
        $error_msg = "";
        if (curl_errno($curl)) {
            $error_msg = 'Errno' . curl_error($curl);
        }
        // 关闭CURL会话
        curl_close($curl);
        // 返回结果
        $response["response_body"] = $response_body; //请求接口返回的数据 大于0代表成功，否则根据返回值查找错误
        $response["error_msg"] = $error_msg; //curl post 提交发生的错误
        return $response;
    }
}
